"""
新API演示 - 展示样板代码消除效果
重构版本：基于Linus设计哲学，消除导入混乱和未完成功能
"好代码没有特殊情况"
"""

import asyncio
from gua import (
    GuaApp,
    respond,
    stream,
    cors,
    logging,
    rate_limit,
    create_websocket_manager,
    error,
)
from gua.streaming_utils import create_sse_events
from gua.websocket_utils import create_chat_websocket

# 创建应用实例
app = GuaApp()

# 使用声明式中间件 - 一行配置
app.use(cors("*", "GET,POST,PUT,DELETE"))
app.use(logging("请求: {method} {path}"))
app.use(rate_limit(max_requests=20, window_seconds=60))  # 增加限制以避免测试时触发限流


# 基本路由 - 自动内容检测
@app.route("/")
async def home():
    return respond("<h1>Hello World</h1>")  # 自动检测为HTML


@app.route("/api")
async def api():
    return respond({"message": "Hello API"})  # 自动检测为JSON


@app.route("/text")
async def text_page():
    return respond("Plain text response")  # 自动检测为文本


# 流式响应 - 链式API，无需手动创建generator
@app.route("/stream")
async def stream_data():
    return (
        stream()
        .range(0, 10, 1.0)  # 数字0-9，延迟1.0秒
        .text("Hello", 0.8)  # 文本字符，延迟0.8秒
        .json({"status": "complete"}, 0)  # JSON数据，无延迟
        .build()
    )


# SSE响应 - Linus式重构：使用通用SSE生成器
@app.route("/sse")
async def sse_events():
    """模拟真实的长时间任务处理，产生真实的事件流"""
    return create_sse_events()


# 便捷流式函数 - 一行创建
@app.route("/quick-stream")
async def quick_stream():
    return stream().range(0, 5, 1.5).build()


# 便捷SSE函数 - Linus式重构：使用通用SSE生成器
@app.route("/ping")
async def ping_sse():
    """心跳SSE - 使用通用SSE生成器"""
    events = [
        {"event": "ping", "data": f"心跳 {i+1}", "id": f"ping_{i+1}"}
        for i in range(5)
    ]
    
    async def ping_generator():
        for event in events:
            yield event
            await asyncio.sleep(1.0)
    
    return create_sse_events(custom_generator=ping_generator())


# WebSocket路由 - 使用统一连接管理器
ws_manager = create_websocket_manager()


@app.websocket("/ws")
async def websocket_handler(scope, receive, send):
    """WebSocket处理器 - Linus式重构：使用通用WebSocket处理器"""
    return await create_chat_websocket(scope, receive, send)


# 受保护的路由 - 使用声明式认证中间件
@app.route("/protected")
async def protected_route():
    return respond({"message": "这是受保护的内容"})


# 只对API路径应用限流 - 使用内联中间件
@app.middleware
def api_rate_limit(handler):
    async def wrapper(scope, receive, send):
        if scope["path"].startswith("/api/"):
            # 简单的限流逻辑
            pass  # 这里可以实现实际的限流
        return await handler(scope, receive, send)

    return wrapper


app.use(api_rate_limit)


@app.route("/api/data")
async def api_data():
    return respond({"data": [1, 2, 3, 4, 5]})


# 错误处理 - 自动错误格式化
@app.route("/error")
async def error_demo():
    return error("这是一个错误示例", 400)


# 文件下载 - 自动内容类型检测
@app.route("/download")
async def download_file():
    return respond(b"Binary file content")  # 自动检测为二进制流


if __name__ == "__main__":
    import subprocess
    import sys
    
    # 使用gua命令显示示例启动信息
    result = subprocess.run([sys.executable, "-m", "gua.cli", "examples.new_api_demo:app", "--example-info"],
                          capture_output=True, text=True)
    if result.returncode == 0:
        print(result.stdout)
    else:
        print("错误: 无法显示启动信息")
        print("请手动运行: gua examples.new_api_demo:app --example-info")